package com.hs.core.dao.impl;

import java.sql.Time;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.hs.core.dao.IBaseDao;
import com.hs.core.model.BaseBean;


public class BaseDao extends HibernateDaoSupport implements IBaseDao{
	protected SessionFactory sessionFactory0;
	 @Autowired  
	public void setSessionFactory0(SessionFactory sessionFactory) { 
	        super.setSessionFactory( sessionFactory);   
	    }   
	public void save(Object obj){ 
		 
		this.getHibernateTemplate().saveOrUpdate(obj);
		
	} 
	public void delete(Object obj){
		
		this.getHibernateTemplate().delete(obj);
	}
	
	public void update(Object obj){
		this.getHibernateTemplate().update(obj);
	}
	/**
	 * 
	 * 功能:保存一个实例化对象
	 * 作者: hs
	 * 创建日期:2006-6-13
	 * @param baseBean
	 */
	public void saveObject(BaseBean baseBean) {
		getHibernateTemplate().saveOrUpdate(baseBean);

	}

	/**
	 * 
	 * 功能:更新一个实例化对象
	 * 作者: hs
	 * 创建日期:2006-6-13
	 * @param baseBean
	 */
	public void update(BaseBean baseBean) {
		getHibernateTemplate().update(baseBean);

	}
	
	
	/**
	 * 
	 * 功能:更新一个实例化对象
	 * 作者: hs
	 * 创建日期:2006-6-13
	 * @param baseBean
	 */
	public void save(BaseBean baseBean) {
		getHibernateTemplate().save(baseBean);

	}

	/**
	 * 
	 * 功能:删除一个映射对象
	 * 作者: hs
	 * 创建日期:2006-6-13
	 * @param baseBean
	 */
	public void deleteObject(BaseBean baseBean) {
		getHibernateTemplate().delete(baseBean);
	}

	/**
	 * 
	 * 功能:删除一组映射对象
	 * 作者: hs
	 * 创建日期:2006-6-13
	 * @param list
	 */
	public void deleteList(Collection list) {
		getHibernateTemplate().deleteAll(list);

	}
	/**
	 * 
	 * 功能:保存一组映射对象
	 * 作者: hs
	 * 创建日期:2006-6-13
	 * @param list
	 */
	public void saveOrUpdateAll(Collection list) {
		getHibernateTemplate().saveOrUpdateAll(list);

	}

	/**
	 * 
	 * 功能:根据类的对象class和id,返回id对应的对象实例
	 * 作者: hs
	 * 创建日期:2006-6-13
	 * @param entityClass   如:BugRecord.class
	 * @param id 主键
	 * @return
	 */
	public Object findByID(Class entityClass, Long id) {
		return getHibernateTemplate().get(entityClass, id);
	}

	
	/**
	 * 
	 * 功能:根据类的对象class和id,返回id对应的对象实例
	 * 作者: hs
	 * 创建日期:2006-6-13
	 * @param entityClass   如:BugRecord.class
	 * @param id 主键
	 * @return
	 */
	public Object findByID(Class entityClass, String id) {
		return getHibernateTemplate().get(entityClass, id);
	}
    
    /**
     * 功能:执行删除或更新类Hql语句，无返回值<br>
     * 作者: hs<br>
     * 创建日期:Jul 5, 2006
     * @param hql
     */
    protected void executeUpdate(final String hql){
        this.getHibernateTemplate().execute(new HibernateCallback(){
            public Object doInHibernate(Session sess){
                Query query=sess.createQuery(hql);
                query.executeUpdate();
                releaseSession(sess);
                return null;
               }
            }
        );
    }
    
    /**
     * 功能:执行带参数的删除或更新类的Hql语句，无返回值<br>
     * 参数的个数和顺序必须和hql语句中的问号相匹配<br>
     * 作者: hs<br>
     * 创建日期:Jul 5, 2006
     * @param hql
     * @param params
     */
    protected void executeUpdate(final String hql,final Object[] params){
        this.getHibernateTemplate().execute(new HibernateCallback(){
            public Object doInHibernate(Session sess){
                Query query=sess.createQuery(hql);
                if(null != params && params.length>0){
                    for(int i=0;i<params.length;i++){
                        Object obj=params[i];
                        if(obj instanceof Long){
                            query.setLong(i,((Long)obj).longValue());                            
                        }else if(obj instanceof String){
                            query.setString(i,obj.toString());
                        }else if(obj instanceof Double){
                            query.setDouble(i,((Double)obj).doubleValue());
                        }else if(obj instanceof Float){
                            query.setFloat(i,((Float)obj).floatValue());
                        }else if(obj instanceof Integer){
                            query.setInteger(i,((Integer)obj).intValue());
                        }else if(obj instanceof Date || obj instanceof Time){
                            query.setDate(i,(Date)obj);
                        }else if(obj instanceof Short){
                            query.setShort(i,((Short)obj).shortValue());
                        }else if(obj instanceof Boolean){
                            query.setBoolean(i,((Boolean)obj).booleanValue());
                        }
                    }
                }
                query.executeUpdate();
                releaseSession(sess);
                return null;
               }
            }
        );
    }
    
    /*
     *  （非 Javadoc）
     * @see cn.com.sgcc.core.base.IDao#delAllResultByProperty(java.lang.Class, java.lang.String, java.util.List)
     */
    public void delAllResultByProperty(Class clas,String propertyName,List valueList){
        if(null != clas){
            if(null != propertyName && !"".equals(propertyName)){
                if(null != valueList && valueList.size()>0){
                    StringBuffer hql=new StringBuffer("delete "+clas.getName()+" where "+propertyName+" in(");
                    for(int i=0; i<valueList.size();i++){
                        hql.append(valueList.get(i));
                        if(i!=valueList.size()-1){
                            hql.append(" ,");
                        }
                    }
                    hql.append(")");
                    this.executeUpdate(hql.toString());
                }
            }
        }
    }
    
    /*
     *  （非 Javadoc）
     * @see cn.com.sgcc.core.base.IDao#delAllResultByProperty(java.lang.Class, java.lang.String, java.lang.Object)
     */
    public void delAllResultByProperty(Class clas,String propertyName,Object value){
        if(null != clas){
            if(null != propertyName && !"".equals(propertyName)){
                if(null != value && !"".equals(value)){
                    String hql="delete "+clas.getName()+" where "+propertyName+" = ?";
                    this.executeUpdate(hql,new Object[]{value});
                }
            }
        }
        
    }
    
    
    /*
     * （非 Javadoc）
     * @see cn.com.sgcc.core.base.IDao#findByExampleUnique(java.lang.Class, java.lang.Object)
     */
    public Object findByExampleUnique(Class classObj,Object exampleObj){
        Criteria criteria = this.getSession().createCriteria(classObj)
        		.add(Example.create(exampleObj));
        return criteria.uniqueResult();
    }
    
    /*
     * （非 Javadoc）
     * @see cn.com.sgcc.core.base.IDao#findByExample(java.lang.Class, java.lang.Object)
     */
    public List findByExample(Class classObj,Object exampleObj){
        Criteria criteria = this.getSession().createCriteria(classObj)
        		.add(Example.create(exampleObj));
        return criteria.list();
    }
    
    /**
	 * 功能:公用的查找list的方法
	 * <br>作者: hs<br>
	 * 创建日期:2007-9-12
	 * @param hql
	 * @param param
	 * @return
	 */
	public List findList(String hql,Object param){
		if(null == param)
			return this.getHibernateTemplate().find(hql);
		else
			return this.getHibernateTemplate().find(hql,param);
	}
	
	/**
	 * 
	 * 功能: 获得列表 
	 * 创建日期:2006-12-14
	 * @param hql
	 * @return
	 */
	public List findList(String hql){
		return this.getHibernateTemplate().find(hql);
	}
	public void saveObjectTans(BaseBean baseBean) {
		Session session = getHibernateTemplate().getSessionFactory().openSession();;
		Transaction tc = session.beginTransaction();
		tc.begin();
		getHibernateTemplate().saveOrUpdate(baseBean);
		tc.commit();
		session.close();
	}
}
